/*Copyright (C) 2009 - 2011 MASSART GAUTHIER

This program is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public
License along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/

#include "../headers.h"

void tet_affiche_legende() {

	afficher_titre("TETRIS");

	CSLP_ColorText(COLOR_WHITE);

	mvaddstr(7, DEFAULT_SCREEN_SIZE_X / 2 + 14, "Prochaine : ");
	mvaddstr(15, DEFAULT_SCREEN_SIZE_X / 2 + 14, "Commandes : ");
	mvaddstr(17, DEFAULT_SCREEN_SIZE_X / 2 + 16, "[ESPACE] : tourner");

	move(18, DEFAULT_SCREEN_SIZE_X / 2 + 17);
	afficher_touche(touche_gauche);
	addstr("      : gauche");

	move(19, DEFAULT_SCREEN_SIZE_X / 2 + 17);
	afficher_touche(touche_droite);
	addstr("      : droite");

	move(20, DEFAULT_SCREEN_SIZE_X / 2 + 17);
	afficher_touche(touche_bas);
	addstr("      : descendre");

	move(21, DEFAULT_SCREEN_SIZE_X / 2 + 17);
	afficher_touche(touche_haut);
	addstr("      : tout en bas");

	mvaddstr(22, DEFAULT_SCREEN_SIZE_X / 2 + 16, "[r]      : réserve");
	mvaddstr(23, DEFAULT_SCREEN_SIZE_X / 2 + 16, "[0]      : quitter");


	mvaddstr(27, DEFAULT_SCREEN_SIZE_X / 2 + 14, "Meilleur score :");
	move(29, DEFAULT_SCREEN_SIZE_X / 2 + 16);

	if(lire_suppr_score("Tetris", true) != -1) {
		move(29, DEFAULT_SCREEN_SIZE_X / 2 + 16);
		CSLP_ColorText(COLOR_RED);
		tetris_meilleur_score = lire_suppr_score("Tetris", true);
		CSLP_ColorText(COLOR_WHITE);
		addstr(" a atteind ");
		CSLP_ColorText(COLOR_RED);
		printw("%d ", tetris_meilleur_score);
		CSLP_ColorText(COLOR_WHITE);
		addstr("points !");
	}
	else {
		move(29, DEFAULT_SCREEN_SIZE_X / 2 + 14);
		addstr("Pas de meilleur score !");
	}

	mvaddstr(7 , x_begin_center(55), "Niveau ");
	mvaddstr(11, x_begin_center(55), "Réserve : ");
	mvaddstr(19, x_begin_center(55), "Lignes : ");
	mvaddstr(21, x_begin_center(55), "Points : ");
}

/*******************************************/

void tet_animation_enlever_ligne(int matrice[][TET_HAUTEUR], int lignesPleines[]) {
	int i, nombre_lignes = 0;

	if(lignesPleines[0] > 0) {
		jouer_son(TETRISLIGNEPLEINE);

		if(lignesPleines[1] == 0) {

			for(i = 0; i < TET_LARGEUR; i++) {
				matrice[i][lignesPleines[0]] = COLOR_WHITE;
				tet_afficher(matrice);
				CSLP_Sleep(TET_ATTENTE_ANIM);
			}
			nombre_lignes = 1;
			tetris_points += 10;
		}
		else if(lignesPleines[2] == 0) {

			for(i = 0; i < TET_LARGEUR; i++) {
				matrice[i][lignesPleines[0]] = COLOR_RED;
				matrice[TET_LARGEUR - (i + 1)][lignesPleines[1]] = COLOR_WHITE;
				tet_afficher(matrice);
				CSLP_Sleep(TET_ATTENTE_ANIM);
			}
			nombre_lignes = 2;
			tetris_points += 30;
		}
		else if(lignesPleines[3] == 0) {

			for(i = 0; i < TET_LARGEUR; i++) {
				matrice[i][lignesPleines[0]] = COLOR_RED;
				matrice[TET_LARGEUR - (i + 1)][lignesPleines[1]] = COLOR_WHITE;
				matrice[i][lignesPleines[2]] = COLOR_RED;
				tet_afficher(matrice);
				CSLP_Sleep(TET_ATTENTE_ANIM);
			}
			nombre_lignes = 3;
			tetris_points += 60;
		}
		else if(lignesPleines[3]) {

			for(i = 0; i < TET_LARGEUR; i++) {
				matrice[i][lignesPleines[0]] = COLOR_RED;
				matrice[TET_LARGEUR - (i + 1)][lignesPleines[1]] = COLOR_WHITE;
				matrice[i][lignesPleines[2]] = COLOR_RED;
				matrice[TET_LARGEUR - (i + 1)][lignesPleines[3]] = COLOR_WHITE;
				tet_afficher(matrice);
				CSLP_Sleep(TET_ATTENTE_ANIM);
			}

			jouer_son(TETRISECLAIR);

			for(i = 0; i < 6; i++) {
				attron(A_REVERSE);
				tet_afficher(matrice);
				CSLP_Sleep(TET_ATTENTE_ANIM);
				attroff(A_REVERSE);
				tet_afficher(matrice);
				CSLP_Sleep(TET_ATTENTE_ANIM);
			}
			nombre_lignes = 4;
			tetris_points += 120;
		}
	}

	for(i = 0; i != nombre_lignes; i++) {
		tet_enlever_ligne(matrice, lignesPleines[i]);
	}

	for(i = 0; i < 4; i++)
		lignesPleines[i] = 0;

	while(getch() != ERR);
}

/*******************************************/

void afficher_fantome(int matrice[][TET_HAUTEUR], forme pActuelle) {
	while(pActuelle.posP[0].y < TET_HAUTEUR - 1 && pActuelle.posP[1].y < TET_HAUTEUR - 1 &&
				pActuelle.posP[2].y < TET_HAUTEUR - 1 && pActuelle.posP[3].y < TET_HAUTEUR - 1
				&& (matrice[pActuelle.posP[0].x][pActuelle.posP[0].y + 1] == TET_VIDE
						|| (pActuelle.posP[0].x == pActuelle.posP[1].x && pActuelle.posP[0].y + 1 == pActuelle.posP[1].y)
						|| (pActuelle.posP[0].x == pActuelle.posP[2].x && pActuelle.posP[0].y + 1 == pActuelle.posP[2].y)
						|| (pActuelle.posP[0].x == pActuelle.posP[3].x && pActuelle.posP[0].y + 1 == pActuelle.posP[3].y))
				&& (matrice[pActuelle.posP[1].x][pActuelle.posP[1].y + 1] == TET_VIDE
						|| (pActuelle.posP[1].x == pActuelle.posP[0].x && pActuelle.posP[1].y + 1 == pActuelle.posP[0].y)
						|| (pActuelle.posP[1].x == pActuelle.posP[2].x && pActuelle.posP[1].y + 1 == pActuelle.posP[2].y)
						|| (pActuelle.posP[1].x == pActuelle.posP[3].x && pActuelle.posP[1].y + 1 == pActuelle.posP[3].y))
				&& (matrice[pActuelle.posP[2].x][pActuelle.posP[2].y + 1] == TET_VIDE
						|| (pActuelle.posP[2].x == pActuelle.posP[1].x && pActuelle.posP[2].y + 1 == pActuelle.posP[1].y)
						|| (pActuelle.posP[2].x == pActuelle.posP[0].x && pActuelle.posP[2].y + 1 == pActuelle.posP[0].y)
						|| (pActuelle.posP[2].x == pActuelle.posP[3].x && pActuelle.posP[2].y + 1 == pActuelle.posP[3].y))
				&& (matrice[pActuelle.posP[3].x][pActuelle.posP[3].y + 1] == TET_VIDE
						|| (pActuelle.posP[3].x == pActuelle.posP[1].x && pActuelle.posP[3].y + 1 == pActuelle.posP[1].y)
						|| (pActuelle.posP[3].x == pActuelle.posP[2].x && pActuelle.posP[3].y + 1 == pActuelle.posP[2].y)
						|| (pActuelle.posP[3].x == pActuelle.posP[0].x && pActuelle.posP[3].y + 1 == pActuelle.posP[0].y))) {

		pActuelle.posP[0].y += 1;
		pActuelle.posP[1].y += 1;
		pActuelle.posP[2].y += 1;
		pActuelle.posP[3].y += 1;
	}

	pActuelle.couleur |= TET_HACHURE;

	if(matrice[pActuelle.posP[0].x][pActuelle.posP[0].y] == TET_VIDE) {
		afficher_bloc(TET_POS_MAT_Y + pActuelle.posP[0].y,
									TET_POS_MAT_X + (pActuelle.posP[0].x * 2),
									pActuelle.couleur);
		matrice[pActuelle.posP[0].x][pActuelle.posP[0].y] = TET_FANTOME;
	}

	if(matrice[pActuelle.posP[1].x][pActuelle.posP[1].y] == TET_VIDE) {
		afficher_bloc(TET_POS_MAT_Y + pActuelle.posP[1].y,
									TET_POS_MAT_X + (pActuelle.posP[1].x * 2),
									pActuelle.couleur);
		matrice[pActuelle.posP[1].x][pActuelle.posP[1].y] = TET_FANTOME;
	}

	if(matrice[pActuelle.posP[2].x][pActuelle.posP[2].y] == TET_VIDE) {
		afficher_bloc(TET_POS_MAT_Y + pActuelle.posP[2].y,
									TET_POS_MAT_X + (pActuelle.posP[2].x * 2),
									pActuelle.couleur);
		matrice[pActuelle.posP[2].x][pActuelle.posP[2].y] = TET_FANTOME;
	}

	if(matrice[pActuelle.posP[3].x][pActuelle.posP[3].y] == TET_VIDE) {
		afficher_bloc(TET_POS_MAT_Y + pActuelle.posP[3].y,
									TET_POS_MAT_X + (pActuelle.posP[3].x * 2),
									pActuelle.couleur);
		matrice[pActuelle.posP[3].x][pActuelle.posP[3].y] = TET_FANTOME;
	}
}

/*******************************************/

void afficher_cadre_tetris() {
	int i;

	if(tetris_niveau != tetris_ancien_niveau) {
		if(tetris_niveau != 1) {
			jouer_son(TETRISNEWLEVEL);
		}

		move(TET_POS_MAT_Y - 1, TET_POS_MAT_X - 2);

		for(i = 0; i < TET_LARGEUR * 2 + 4; i++)
			afficher_char_fullblock(1, (tetris_niveau + 4) % 7 + 2);

		for(i = 0; i < TET_HAUTEUR; i++) {
			move(TET_POS_MAT_Y + i, TET_POS_MAT_X - 2);
			afficher_char_fullblock(2, (tetris_niveau + 4) % 7 + 2);
			move(TET_POS_MAT_Y + i, TET_POS_MAT_X + TET_LARGEUR * 2);
			afficher_char_fullblock(2, (tetris_niveau + 4) % 7 + 2);
		}

		move(TET_POS_MAT_Y + TET_HAUTEUR, TET_POS_MAT_X - 2);

		for(i = 0; i < TET_LARGEUR * 2 + 4; i++)
			afficher_char_fullblock(1, (tetris_niveau + 4) % 7 + 2);

		tetris_ancien_niveau = tetris_niveau;
	}

	refresh();
}

/*******************************************/
void tet_afficher(int matrice[][TET_HAUTEUR]) {

	int i, j;
	CSLP_ColorText(COLOR_RED);
	mvaddstr(7, x_begin_center(55) + 10, "     ");
	mvaddstr(21, x_begin_center(55) + 10, "     ");
	mvaddstr(19, x_begin_center(55) + 10, "     ");
	mvprintw(7, x_begin_center(55) + 10, "%d", tetris_niveau);
	mvprintw(19, x_begin_center(55) + 10, "%d", tetris_lignes);
	mvprintw(21, x_begin_center(55) + 10, "%d", tetris_points);
	CSLP_ColorText(COLOR_WHITE);

	for(i = 0; i < TET_HAUTEUR; i++) {
		for(j = 0; j < TET_LARGEUR; j++) {
			switch(matrice[j][i]) {

			case TET_VIDE:
				mvaddch(TET_POS_MAT_Y + i, TET_POS_MAT_X + j * 2, ' ');
				addch(' ');
				break;

			case TET_FANTOME:
				matrice[j][i] = TET_VIDE;
				break;

			default:
				afficher_bloc(TET_POS_MAT_Y + i, TET_POS_MAT_X + j * 2, matrice[j][i]);
				break;
			}
		}
	}

	refresh();
}

/*******************************************/

void afficher_bloc(int y, int x, int couleur) {
	move(y, x);
	char TET[3];
	TET[2] = '\0';

	if(couleur == 100) {
#ifdef WIN32
		CSLP_Color(COLOR_BLUE, COLOR_BLUE);
#else
		CSLP_Color(COLOR_RED, COLOR_RED);
#endif
		addch(TET_SIGNE_GAUCHE);
		addch(TET_SIGNE_DROITE);
		CSLP_Color(COLOR_WHITE, COLOR_BLACK);
	}
	else if(couleur > 100) {
#ifdef WIN32
		CSLP_ColorText(COLOR_BLUE);
#else
		CSLP_ColorText(COLOR_RED);
#endif
		addstr(TET_BLOCK_FANTOME);
		addstr(TET_BLOCK_FANTOME);
		CSLP_ColorText(COLOR_WHITE);
	}
	else if(TET_HACHURE & couleur) {
		couleur &= (~TET_HACHURE);
		CSLP_ColorText(couleur);
		addstr(TET_BLOCK_FANTOME);
		addstr(TET_BLOCK_FANTOME);
		CSLP_ColorText(COLOR_WHITE);
	}
	else {
		CSLP_Color(couleur, couleur);
		addch(TET_SIGNE_GAUCHE);
		addch(TET_SIGNE_DROITE);
		CSLP_Color(COLOR_WHITE, COLOR_BLACK);
	}

	refresh();
}

/*******************************************/

void animation_perdu(int matrice[][TET_HAUTEUR]) {

	int i;

	attron(A_REVERSE);
	tet_afficher(matrice);
	/*FMUSIC_StopSong(tetris);*/
	CSLP_Sleep(1500);
	pause_music(true);
	jouer_son(PERDU);
	CSLP_Sleep(1500);
	attroff(A_REVERSE);

	for(i = 0; i < TET_HAUTEUR; i++) {
		tet_enlever_ligne(matrice, TET_HAUTEUR - 1);
		tetris_lignes--;
		tet_afficher(matrice);
		CSLP_Sleep(TET_ATTENTE_ANIM);
	}

	CSLP_Sleep(1000);
	pause_music(false);

}
